home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The CICA Windows Explosion!
/
The CICA Windows Explosion! - Disc 2.iso
/
demo
/
pwrtcp11.exe
/
TNTCPP.CP_
/
TNTCPP.bin
Wrap
Text File
|
1994-11-14
|
35KB
|
1,202 lines
//---------------------------------------------------------------------------
//
// Module: tty.c
//
// Purpose:
// The sample application demonstrates the usage of the COMM
// API. It implements the new COMM API of Windows 3.1.
//
// NOTE: no escape sequences are translated, only
// the necessary control codes (LF, CR, BS, etc.)
//
// Description of functions:
// Descriptions are contained in the function headers.
//
//---------------------------------------------------------------------------
//
// Written by Microsoft Product Support Services, Windows Developer Support.
// Copyright (c) 1991 Microsoft Corporation. All Rights Reserved.
//
//---------------------------------------------------------------------------
//***************************************************************************
//
// Module: tntcpp.cpp
//
// Purpose:
// The sample application demonstrates the usage of the PowerTCP
// API. It uses the new PowerTCP DLL interface. Compiled under Windows 3.1
// and Windows NT 3.5 Beta
//
// NOTE: This code was derived from Microsoft's tty.h
//
//***************************************************************************
//
// Written by Dart Communication Application Programming Group.
// Copyright (c) 1994 Dart Communications. All Rights Reserved.
//
//***************************************************************************
#define STRICT // be bold!
#pragma warning (disable:4100 4355 4699)
#include <windows.h>
#include <commdlg.h>
#include <string.h>
#include <malloc.h>
#include "version.h"
#include "tntc.hh"
#include "..\..\include\powertcp.h"
#include "..\..\include\powertcp.hpp" // for CPowerTcp class def
#include "..\..\include\powertnt.hpp" // for CPowerTelnet class def
#include "tntsampl.hpp" // for our Derived Class
#include "tntsamp.h"
char szHost[20]="" ;
char szPort[5]="23" ;
WORD Port;
BOOL TransOk;
HINSTANCE hInstance=NULL;
PTTYINFO TTYInfo=NULL;
CMyPowerTelnet *MyPowerTelnet=NULL;
//---------------------------------------------------------------------------
// int PASCAL WinMain( HANDLE hInstance, HANDLE hPrevInstance,
// LPSTR lpszCmdLine, int nCmdShow )
//
// Description:
// This is the main window loop!
//
// Parameters:
// As documented for all WinMain() functions.
//
//---------------------------------------------------------------------------
int PASCAL WinMain( HINSTANCE hNewInstance, HINSTANCE hPrevInstance,
LPSTR lpszCmdLine, int nCmdShow )
{
HWND hTTYWnd ;
MSG msg ;
hInstance=hNewInstance;
if (!hPrevInstance)
if (!InitApplication( hInstance ))
return ( FALSE ) ;
if (NULL == (hTTYWnd = InitInstance( hInstance, nCmdShow )))
return ( FALSE ) ;
while (GetMessage( &msg, NULL, 0, 0 ))
{
if (!TranslateAccelerator( hTTYWnd, ghAccel, &msg ))
{
TranslateMessage( &msg ) ;
DispatchMessage( &msg ) ;
}
}
return ( (int) msg.wParam ) ;
} // end of WinMain()
//---------------------------------------------------------------------------
// BOOL InitApplication( HANDLE hInstance )
//
// Description:
// First time initialization stuff. This registers information
// such as window classes.
//
// Parameters:
// HANDLE hInstance
// Handle to this instance of the application.
//
//---------------------------------------------------------------------------
BOOL InitApplication( HINSTANCE hInstance )
{
WNDCLASS wndclass ;
// register tty window class
wndclass.style = 0 ;
wndclass.lpfnWndProc = TTYWndProc ;
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = 0;
wndclass.hInstance = hInstance ;
wndclass.hIcon = LoadIcon( hInstance, "PowerTNT" );
wndclass.hCursor = LoadCursor( NULL, IDC_ARROW ) ;
wndclass.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1) ;
wndclass.lpszMenuName = MAKEINTRESOURCE( TTYMENU ) ;
wndclass.lpszClassName = gszTTYClass ;
return( RegisterClass( &wndclass ) ) ;
} // end of InitApplication()
//---------------------------------------------------------------------------
// HWND InitInstance( HANDLE hInstance, int nCmdShow )
//
// Description:
// Initializes instance specific information.
//
// Parameters:
// HANDLE hInstance
// Handle to instance
//
// int nCmdShow
// How do we show the window?
//
//---------------------------------------------------------------------------
HWND InitInstance( HINSTANCE hInstance, int nCmdShow )
{
HWND hTTYWnd ;
// load accelerators
ghAccel = LoadAccelerators( hInstance, MAKEINTRESOURCE( TTYACCEL ) ) ;
// create the TTY window
hTTYWnd = CreateWindow( gszTTYClass, gszAppName,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL, hInstance, NULL ) ;
if (NULL == hTTYWnd)
return ( NULL ) ;
ShowWindow( hTTYWnd, nCmdShow ) ;
UpdateWindow( hTTYWnd ) ;
SetWindowText(hTTYWnd, " PowerTCP TELNET Demo ");
OpenConnection(hTTYWnd);
return ( hTTYWnd ) ;
} // end of InitInstance()
//---------------------------------------------------------------------------
// LRESULT FAR PASCAL __export TTYWndProc( HWND hWnd, UINT uMsg,
// WPARAM wParam, LPARAM lParam )
//
// Description:
// This is the TTY Window Proc. This handles ALL messages
// to the tty window.
//
// Parameters:
// As documented for Window procedures.
//
//---------------------------------------------------------------------------
LRESULT CALLBACK TTYWndProc( HWND hWnd, UINT uMsg,
WPARAM wParam, LPARAM lParam )
{
switch (uMsg)
{
case WM_CREATE:
return ( CreateTTYInfo( hWnd ) ) ;
case WM_COMMAND:
{
switch ((WORD) wParam)
{
case IDM_CONNECT:
if (!OpenConnection( hWnd ))
MessageBox( hWnd, "Connection failed.", gszAppName,
MB_ICONEXCLAMATION ) ;
break ;
case IDM_DISCONNECT:
CloseConnection( hWnd ) ;
int i;
i=5;
break ;
case IDM_ABOUT:
GoModalDialogBoxParam ( hInstance,
MAKEINTRESOURCE( ABOUTDLGBOX ),
hWnd,
AboutDlgProc, 0l ) ;
break;
case IDM_EXIT:
PostMessage( hWnd, WM_CLOSE, 0, 0L ) ;
break ;
}
}
break ;
case WM_PAINT:
PaintTTY( hWnd ) ;
break ;
case WM_SIZE:
SizeTTY( hWnd, HIWORD( lParam ), LOWORD( lParam ) ) ;
break ;
case WM_HSCROLL:
ScrollTTYHorz( hWnd, (WORD) wParam, LOWORD( lParam ) ) ;
break ;
case WM_VSCROLL:
ScrollTTYVert( hWnd, (WORD) wParam, LOWORD( lParam ) ) ;
break ;
case WM_CHAR:
ProcessTTYCharacter( hWnd, LOBYTE( wParam ) ) ;
break ;
case WM_SETFOCUS:
SetTTYFocus( hWnd ) ;
break ;
case WM_KILLFOCUS:
KillTTYFocus( hWnd ) ;
break ;
case WM_DESTROY:
DestroyTTYInfo( hWnd ) ;
PostQuitMessage( 0 ) ;
break ;
case WM_CLOSE:
if (MyPowerTelnet)
{
delete MyPowerTelnet;
MyPowerTelnet=NULL;
}
GoModalDialogBoxParam ( hInstance,
MAKEINTRESOURCE( ABOUTDLGBOX ),
hWnd,
AboutDlgProc, 0l ) ;
// fall through
default:
return( DefWindowProc( hWnd, uMsg, wParam, lParam ) ) ;
}
return 0L ;
} // end of TTYWndProc()
//---------------------------------------------------------------------------
// LRESULT CreateTTYInfo( HWND hWnd )
//
// Description:
// Creates the tty information structure and sets
// menu option availability. Returns -1 if unsuccessful.
//
// Parameters:
// HWND hWnd
// Handle to main window.
//
//---------------------------------------------------------------------------
LRESULT CreateTTYInfo( HWND hWnd )
{
HMENU hMenu ;
if (NULL == (TTYInfo =
(PTTYINFO) malloc( sizeof( TTYINFO ) )))
return ( (LRESULT) -1 ) ;
// initialize TTY info structure
memset (TTYInfo,0,sizeof(TTYINFO));
COMDEV( TTYInfo ) = 0 ;
CONNECTED( TTYInfo ) = FALSE ;
CURSORSTATE( TTYInfo ) = CS_HIDE ;
LOCALECHO( TTYInfo ) = FALSE ;
AUTOWRAP( TTYInfo ) = TRUE ;
// clear screen space
memset( SCREEN( TTYInfo ), ' ', MAXROWS * MAXCOLS ) ;
// setup default font information
LFTTYFONT( TTYInfo ).lfHeight = 12 ;
LFTTYFONT( TTYInfo ).lfWidth = 0 ;
LFTTYFONT( TTYInfo ).lfEscapement = 0 ;
LFTTYFONT( TTYInfo ).lfOrientation = 0 ;
LFTTYFONT( TTYInfo ).lfWeight = 0 ;
LFTTYFONT( TTYInfo ).lfItalic = 0 ;
LFTTYFONT( TTYInfo ).lfUnderline = 0 ;
LFTTYFONT( TTYInfo ).lfStrikeOut = 0 ;
LFTTYFONT( TTYInfo ).lfCharSet = OEM_CHARSET ;
LFTTYFONT( TTYInfo ).lfOutPrecision = OUT_DEFAULT_PRECIS ;
LFTTYFONT( TTYInfo ).lfClipPrecision = CLIP_DEFAULT_PRECIS ;
LFTTYFONT( TTYInfo ).lfQuality = DEFAULT_QUALITY ;
LFTTYFONT( TTYInfo ).lfPitchAndFamily = FIXED_PITCH | FF_MODERN ;
LFTTYFONT( TTYInfo ).lfFaceName[0] = 0 ;
// reset the character information, etc.
ResetTTYScreen( hWnd ) ;
hMenu = GetMenu( hWnd ) ;
EnableMenuItem( hMenu, IDM_DISCONNECT,
MF_GRAYED | MF_DISABLED | MF_BYCOMMAND ) ;
EnableMenuItem( hMenu, IDM_CONNECT, MF_ENABLED | MF_BYCOMMAND ) ;
return ( (LRESULT) TRUE ) ;
} // end of CreateTTYInfo()
//---------------------------------------------------------------------------
// BOOL DestroyTTYInfo( HWND hWnd )
//
// Description:
// Destroys block associated with TTY window handle.
//
// Parameters:
// HWND hWnd
// handle to TTY window
//
//---------------------------------------------------------------------------
BOOL DestroyTTYInfo( HWND hWnd )
{
if (!TTYInfo)
return ( FALSE ) ;
// force connection closed (if not already closed)
if (CONNECTED( TTYInfo ))
CloseConnection( hWnd ) ;
DeleteObject( HTTYFONT( TTYInfo ) ) ;
free ( TTYInfo ) ;
return ( TRUE ) ;
} // end of DestroyTTYInfo()
//---------------------------------------------------------------------------
// BOOL ResetTTYScreen( HWND hWnd, TTYINFO TTYInfo )
//
// Description:
// Resets the TTY character information and causes the
// screen to resize to update the scroll information.
//
// Parameters:
// TTYINFO TTYInfo
// pointer to TTY info structure
//
//---------------------------------------------------------------------------
BOOL ResetTTYScreen( HWND hWnd)
{
HDC hDC ;
TEXTMETRIC tm ;
RECT rcWindow ;
if (NULL == TTYInfo)
return ( FALSE ) ;
if (NULL != HTTYFONT( TTYInfo ))
DeleteObject( HTTYFONT( TTYInfo ) ) ;
HTTYFONT( TTYInfo ) = CreateFontIndirect( &LFTTYFONT( TTYInfo ) ) ;
hDC = GetDC( hWnd ) ;
SelectObject( hDC, HTTYFONT( TTYInfo ) ) ;
GetTextMetrics( hDC, &tm ) ;
ReleaseDC( hWnd, hDC ) ;
XCHAR( TTYInfo ) = tm.tmAveCharWidth ;
YCHAR( TTYInfo ) = tm.tmHeight + tm.tmExternalLeading ;
// a slimy hack to force the scroll position, region to
// be recalculated based on the new character sizes
GetWindowRect( hWnd, &rcWindow ) ;
SendMessage( hWnd, WM_SIZE, SIZENORMAL,
(LPARAM) MAKELONG( rcWindow.right - rcWindow.left,
rcWindow.bottom - rcWindow.top ) ) ;
return ( TRUE ) ;
} // end of ResetTTYScreen()
//---------------------------------------------------------------------------
// BOOL PaintTTY( HWND hWnd )
//
// Description:
// Paints the rectangle determined by the paint struct of
// the DC.
//
// Parameters:
// HWND hWnd
// handle to TTY window (as always)
//
//---------------------------------------------------------------------------
BOOL PaintTTY( HWND hWnd )
{
int nRow, nCol, nEndRow, nEndCol, nCount, nHorzPos, nVertPos ;
HDC hDC ;
HGDIOBJ hOldFont ;
PAINTSTRUCT ps ;
RECT rect ;
if (NULL == TTYInfo)
return ( FALSE ) ;
hDC = BeginPaint( hWnd, &ps ) ;
hOldFont = SelectObject( hDC, HTTYFONT( TTYInfo ) ) ;
SetTextColor( hDC, FGCOLOR( TTYInfo ) ) ;
SetBkColor( hDC, GetSysColor( COLOR_WINDOW ) ) ;
rect = ps.rcPaint ;
nRow =
min( MAXROWS - 1,
max( 0, (rect.top + YOFFSET( TTYInfo )) / YCHAR( TTYInfo ) ) ) ;
nEndRow =
min( MAXROWS - 1,
((rect.bottom + YOFFSET( TTYInfo ) - 1) / YCHAR( TTYInfo ) ) ) ;
nCol =
min( MAXCOLS - 1,
max( 0, (rect.left + XOFFSET( TTYInfo )) / XCHAR( TTYInfo ) ) ) ;
nEndCol =
min( MAXCOLS - 1,
((rect.right + XOFFSET( TTYInfo ) - 1) / XCHAR( TTYInfo ) ) ) ;
nCount = nEndCol - nCol + 1 ;
for (; nRow <= nEndRow; nRow++)
{
nVertPos = (nRow * YCHAR( TTYInfo )) - YOFFSET( TTYInfo ) ;
nHorzPos = (nCol * XCHAR( TTYInfo )) - XOFFSET( TTYInfo ) ;
rect.top = nVertPos ;
rect.bottom = nVertPos + YCHAR( TTYInfo ) ;
rect.left = nHorzPos ;
rect.right = nHorzPos + XCHAR( TTYInfo ) * nCount ;
SetBkMode( hDC, OPAQUE ) ;
ExtTextOut( hDC, nHorzPos, nVertPos, ETO_OPAQUE | ETO_CLIPPED, &rect,
(LPSTR)( SCREEN( TTYInfo ) + nRow * MAXCOLS + nCol ),
nCount, NULL ) ;
}
SelectObject( hDC, hOldFont ) ;
EndPaint( hWnd, &ps ) ;
MoveTTYCursor( hWnd ) ;
return ( TRUE ) ;
} // end of PaintTTY()
//---------------------------------------------------------------------------
// BOOL SizeTTY( HWND hWnd, WORD wVertSize, WORD wHorzSize )
//
// Description:
// Sizes TTY and sets up scrolling regions.
//
// Parameters:
// HWND hWnd
// handle to TTY window
//
// WORD wVertSize
// new vertical size
//
// WORD wHorzSize
// new horizontal size
//
//---------------------------------------------------------------------------
BOOL SizeTTY( HWND hWnd, WORD wVertSize, WORD wHorzSize )
{
int nScrollAmt ;
if (NULL == TTYInfo)
return ( FALSE ) ;
YSIZE( TTYInfo ) = (int) wVertSize ;
YSCROLL( TTYInfo ) = max( 0, (MAXROWS * YCHAR( TTYInfo )) -
YSIZE( TTYInfo ) ) ;
nScrollAmt = min( YSCROLL( TTYInfo ), YOFFSET( TTYInfo ) ) -
YOFFSET( TTYInfo ) ;
ScrollWindow( hWnd, 0, -nScrollAmt, NULL, NULL ) ;
YOFFSET( TTYInfo ) = YOFFSET( TTYInfo ) + nScrollAmt ;
SetScrollPos( hWnd, SB_VERT, YOFFSET( TTYInfo ), FALSE ) ;
SetScrollRange( hWnd, SB_VERT, 0, YSCROLL( TTYInfo ), TRUE ) ;
XSIZE( TTYInfo ) = (int) wHorzSize ;
XSCROLL( TTYInfo ) = max( 0, (MAXCOLS * XCHAR( TTYInfo )) -
XSIZE( TTYInfo ) ) ;
nScrollAmt = min( XSCROLL( TTYInfo ), XOFFSET( TTYInfo )) -
XOFFSET( TTYInfo ) ;
ScrollWindow( hWnd, 0, -nScrollAmt, NULL, NULL ) ;
XOFFSET( TTYInfo ) = XOFFSET( TTYInfo ) + nScrollAmt ;
SetScrollPos( hWnd, SB_HORZ, XOFFSET( TTYInfo ), FALSE ) ;
SetScrollRange( hWnd, SB_HORZ, 0, XSCROLL( TTYInfo ), TRUE ) ;
InvalidateRect( hWnd, NULL, TRUE ) ;
return ( TRUE ) ;
} // end of SizeTTY()
//---------------------------------------------------------------------------
// BOOL ScrollTTYVert( HWND hWnd, WORD wScrollCmd, WORD wScrollPos )
//
// Description:
// Scrolls TTY window vertically.
//
// Parameters:
// HWND hWnd
// handle to TTY window
//
// WORD wScrollCmd
// type of scrolling we're doing
//
// WORD wScrollPos
// scroll position
//
//---------------------------------------------------------------------------
BOOL ScrollTTYVert( HWND hWnd, WORD wScrollCmd, WORD wScrollPos )
{
int nScrollAmt ;
if (NULL == TTYInfo)
return ( FALSE ) ;
switch (wScrollCmd)
{
case SB_TOP:
nScrollAmt = -YOFFSET( TTYInfo ) ;
break ;
case SB_BOTTOM:
nScrollAmt = YSCROLL( TTYInfo ) - YOFFSET( TTYInfo ) ;
break ;
case SB_PAGEUP:
nScrollAmt = -YSIZE( TTYInfo ) ;
break ;
case SB_PAGEDOWN:
nScrollAmt = YSIZE( TTYInfo ) ;
break ;
case SB_LINEUP:
nScrollAmt = -YCHAR( TTYInfo ) ;
break ;
case SB_LINEDOWN:
nScrollAmt = YCHAR( TTYInfo ) ;
break ;
case SB_THUMBPOSITION:
nScrollAmt = wScrollPos - YOFFSET( TTYInfo ) ;
break ;
default:
return ( FALSE ) ;
}
if ((YOFFSET( TTYInfo ) + nScrollAmt) > YSCROLL( TTYInfo ))
nScrollAmt = YSCROLL( TTYInfo ) - YOFFSET( TTYInfo ) ;
if ((YOFFSET( TTYInfo ) + nScrollAmt) < 0)
nScrollAmt = -YOFFSET( TTYInfo ) ;
ScrollWindow( hWnd, 0, -nScrollAmt, NULL, NULL ) ;
YOFFSET( TTYInfo ) = YOFFSET( TTYInfo ) + nScrollAmt ;
SetScrollPos( hWnd, SB_VERT, YOFFSET( TTYInfo ), TRUE ) ;
return ( TRUE ) ;
} // end of ScrollTTYVert()
//---------------------------------------------------------------------------
// BOOL ScrollTTYHorz( HWND hWnd, WORD wScrollCmd, WORD wScrollPos )
//
// Description:
// Scrolls TTY window horizontally.
//
// Parameters:
// HWND hWnd
// handle to TTY window
//
// WORD wScrollCmd
// type of scrolling we're doing
//
// WORD wScrollPos
// scroll position
//
//---------------------------------------------------------------------------
BOOL ScrollTTYHorz( HWND hWnd, WORD wScrollCmd, WORD wScrollPos )
{
int nScrollAmt ;
if (NULL == TTYInfo)
return ( FALSE ) ;
switch (wScrollCmd)
{
case SB_TOP:
nScrollAmt = -XOFFSET( TTYInfo ) ;
break ;
case SB_BOTTOM:
nScrollAmt = XSCROLL( TTYInfo ) - XOFFSET( TTYInfo ) ;
break ;
case SB_PAGEUP:
nScrollAmt = -XSIZE( TTYInfo ) ;
break ;
case SB_PAGEDOWN:
nScrollAmt = XSIZE( TTYInfo ) ;
break ;
case SB_LINEUP:
nScrollAmt = -XCHAR( TTYInfo ) ;
break ;
case SB_LINEDOWN:
nScrollAmt = XCHAR( TTYInfo ) ;
break ;
case SB_THUMBPOSITION:
nScrollAmt = wScrollPos - XOFFSET( TTYInfo ) ;
break ;
default:
return ( FALSE ) ;
}
if ((XOFFSET( TTYInfo ) + nScrollAmt) > XSCROLL( TTYInfo ))
nScrollAmt = XSCROLL( TTYInfo ) - XOFFSET( TTYInfo ) ;
if ((XOFFSET( TTYInfo ) + nScrollAmt) < 0)
nScrollAmt = -XOFFSET( TTYInfo ) ;
ScrollWindow( hWnd, -nScrollAmt, 0, NULL, NULL ) ;
XOFFSET( TTYInfo ) = XOFFSET( TTYInfo ) + nScrollAmt ;
SetScrollPos( hWnd, SB_HORZ, XOFFSET( TTYInfo ), TRUE ) ;
return ( TRUE ) ;
} // end of ScrollTTYHorz()
//---------------------------------------------------------------------------
// BOOL SetTTYFocus( HWND hWnd )
//
// Description:
// Sets the focus to the TTY window also creates caret.
//
// Parameters:
// HWND hWnd
// handle to TTY window
//
//---------------------------------------------------------------------------
BOOL SetTTYFocus( HWND hWnd )
{
if (NULL == TTYInfo)
return ( FALSE ) ;
if (CONNECTED( TTYInfo ) && (CURSORSTATE( TTYInfo ) != CS_SHOW))
{
CreateCaret( hWnd, NULL, XCHAR( TTYInfo ), YCHAR( TTYInfo ) ) ;
ShowCaret( hWnd ) ;
CURSORSTATE( TTYInfo ) = CS_SHOW ;
}
MoveTTYCursor( hWnd ) ;
return ( TRUE ) ;
} // end of SetTTYFocus()
//---------------------------------------------------------------------------
// BOOL KillTTYFocus( HWND hWnd )
//
// Description:
// Kills TTY focus and destroys the caret.
//
// Parameters:
// HWND hWnd
// handle to TTY window
//
//---------------------------------------------------------------------------
BOOL KillTTYFocus( HWND hWnd )
{
if (NULL == TTYInfo)
return ( FALSE ) ;
if (CONNECTED( TTYInfo ) && (CURSORSTATE( TTYInfo ) != CS_HIDE))
{
HideCaret( hWnd ) ;
DestroyCaret() ;
CURSORSTATE( TTYInfo ) = CS_HIDE ;
}
return ( TRUE ) ;
} // end of KillTTYFocus()
//---------------------------------------------------------------------------
// BOOL MoveTTYCursor( HWND hWnd )
//
// Description:
// Moves caret to current position.
//
// Parameters:
// HWND hWnd
// handle to TTY window
//
//---------------------------------------------------------------------------
BOOL MoveTTYCursor( HWND hWnd )
{
if (NULL == TTYInfo)
return ( FALSE ) ;
if (CONNECTED( TTYInfo ) && (CURSORSTATE( TTYInfo ) & CS_SHOW))
SetCaretPos( (COLUMN( TTYInfo ) * XCHAR( TTYInfo )) -
XOFFSET( TTYInfo ),
(ROW( TTYInfo ) * YCHAR( TTYInfo )) -
YOFFSET( TTYInfo ) ) ;
return ( TRUE ) ;
} // end of MoveTTYCursor()
//---------------------------------------------------------------------------
// BOOL ProcessTTYCharacter( HWND hWnd, BYTE bOut )
//
// Description:
// This simply writes a character to the port and echos it
// to the TTY screen if fLocalEcho is set. Some minor
// keyboard mapping could be performed here.
//
// Parameters:
// HWND hWnd
// handle to TTY window
//
// BYTE bOut
// byte from keyboard
//
//---------------------------------------------------------------------------
BOOL ProcessTTYCharacter( HWND hWnd, BYTE bOut )
{
if (NULL == TTYInfo)
return ( FALSE ) ;
if (!CONNECTED( TTYInfo ))
return ( FALSE ) ;
WriteCommByte( hWnd, bOut ) ;
if (LOCALECHO( TTYInfo ))
WriteTTYBlock( hWnd, &bOut, 1 ) ;
return ( TRUE ) ;
} // end of ProcessTTYCharacter()
//********************************************************************
//
// CMyPowerTelnet Class Definition
//
//********************************************************************
CMyPowerTelnet::CMyPowerTelnet(HINSTANCE hInstance) : CPowerTelnet(hInstance)
{
}
CMyPowerTelnet::~CMyPowerTelnet()
{
}
void CMyPowerTelnet::ConnectEvent(
LPCSTR RemoteDotAddr, /* remote host connected to in dot notation */
WORD RemotePort,/* remote port connected to */
LPCSTR LocalDotAddr, /* local host address in dot notation */
WORD LocalPort, /* local port */
LPCSTR LocalName /* name of default local host */
)
{
HMENU hMenu;
hMenu = GetMenu( hWnd ) ;
EnableMenuItem( hMenu, IDM_DISCONNECT, MF_ENABLED | MF_BYCOMMAND ) ;
EnableMenuItem( hMenu, IDM_CONNECT, MF_GRAYED | MF_DISABLED | MF_BYCOMMAND ) ;
CONNECTED( TTYInfo ) = TRUE;
SetTTYFocus(hWnd);
}
void CMyPowerTelnet::TelnetRecvEvent(
LPVOID Data, /* data from remote source */
size_t Cnt /* byte count for RecvData */
)
{
if (!Data)
{
HMENU hMenu;
KillTTYFocus( hWnd ) ;
CONNECTED( TTYInfo ) = FALSE ;
hMenu = GetMenu( hWnd ) ;
EnableMenuItem( hMenu, IDM_CONNECT, MF_ENABLED | MF_BYCOMMAND ) ;
EnableMenuItem( hMenu, IDM_DISCONNECT, MF_GRAYED | MF_DISABLED | MF_BYCOMMAND ) ;
delete this;
MyPowerTelnet=NULL;
}
else
WriteTTYBlock( hWnd, (LPBYTE)Data, (int) Cnt );
}
void CMyPowerTelnet::TelnetCmdEvent(
BYTE Cmd, /* TELNET command (WILL, WONT, DO, DONT...) */
BYTE Option, /* TELNET option number */
LPBYTE SubOption, /* pointer to sub-option string */
size_t SubOptionCnt /* byte count for SubOption */
)
{
switch (Cmd)
{
case WILL_CMD:
if(( Option == 3) || ( Option == 1))
SendCmd(DO_CMD,Option,NULL,0,0);
else
SendCmd(DONT_CMD,Option,NULL,0,0);
break;
case WONT_CMD:
break;
case DO_CMD:
if (Option==TERMTYPE_OPTION)
// negotiate term type
SendCmd(WILL_CMD,Option,NULL,0,0);
else
SendCmd(WONT_CMD,Option,NULL,0,0);
break;
case DONT_CMD:
SendCmd(WONT_CMD,Option,NULL,0,0);
break;
case SB_CMD:
if( SubOptionCnt && SubOption)
SendCmd(SB_CMD,Option,(LPBYTE)"\000network",8,0);
else
SendCmd(WONT_CMD,Option,NULL,0,0);
break;
default:
break;
}
}
void CMyPowerTelnet::ExceptionEvent(
PT_EXCEPTION ErrorCode, /* spontaneous error notification */
LPCSTR ErrorDesc /* description of error */
)
{
}
//---------------------------------------------------------------------------
// BOOL FAR PASCAL __export ConnectDlgProc( HWND hDlg, UINT uMsg,
// WPARAM wParam, LPARAM lParam )
//
// Description:
// Creates a connect box for the connection.
//
// Parameters:
// Same as standard dialog procedures.
//
//---------------------------------------------------------------------------
//////////////////////////////////////////////////////////////
BOOL CALLBACK ConnectDlgProc( HWND hDlg, UINT uMsg,
WPARAM wParam, LPARAM lParam )
{
switch (uMsg)
{
case WM_INITDIALOG:
SetDlgItemText( hDlg, IDC_HOST, szHost ) ;
SetDlgItemText( hDlg, IDC_PORT, szPort ) ;
break;
case WM_COMMAND:
if ((WORD) wParam == IDD_OK)
{
GetDlgItemText( hDlg, IDC_HOST, szHost, sizeof( szHost ) ) ;
Port = (WORD)GetDlgItemInt( hDlg, IDC_PORT, &TransOk, FALSE);
EndDialog( hDlg, TRUE ) ;
return ( TRUE ) ;
}
if ((WORD) wParam == IDD_CANCEL)
{
EndDialog( hDlg, FALSE) ;
return (FALSE) ;
}
break;
}
return ( FALSE ) ;
} // end of ConnectDlgProc()
BOOL OpenConnection( HWND hWnd )
{
HCURSOR hOldCursor, hWaitCursor ;
// show the hourglass cursor
hWaitCursor = LoadCursor( NULL, IDC_WAIT ) ;
hOldCursor = SetCursor( hWaitCursor ) ;
if (GoModalDialogBoxParam( hInstance, MAKEINTRESOURCE( CONNECTDLGBOX ), hWnd,
ConnectDlgProc, 0l))
{
MyPowerTelnet=new CMyPowerTelnet(hInstance);
MyPowerTelnet->hWnd=hWnd;
MyPowerTelnet->Connect (
NULL, /* use license number assigned to you by Dart */
PT_SHOW, /* set to PT_DEBUG to get debugging information */
(LPCSTR) szHost, /* use name or dot notation */
Port, /* port to connect to (usually 23 for TELNET) */
NULL, /* NULL or local dot address for multi-homed host */
0 /* use any local port available */
);
}
return (TRUE);
} // end of OpenConnection()
//---------------------------------------------------------------------------
// BOOL CloseConnection( HWND hWnd )
//
// Description:
// Closes the connection to the port. Resets the connect flag
// in the TTYINFO struct.
//
// Parameters:
// HWND hWnd
// handle to TTY window
//
//---------------------------------------------------------------------------
BOOL CloseConnection( HWND hWnd )
{
if (MyPowerTelnet)
MyPowerTelnet->Close(TRUE); // do a hard close
return ( TRUE ) ;
} // end of CloseConnection()
//---------------------------------------------------------------------------
// BOOL WriteCommByte( HWND hWnd, BYTE bByte )
//
// Description:
// Writes a byte to the COM port specified in the associated
// TTY info structure.
//
// Parameters:
// HWND hWnd
// handle to TTY window
//
// BYTE bByte
// byte to write to port
//
//---------------------------------------------------------------------------
BOOL WriteCommByte( HWND hWnd, BYTE bByte )
{
if (NULL == TTYInfo)
return ( FALSE ) ;
//WriteComm( COMDEV( TTYInfo ), (LPSTR) &bByte, 1 ) ;
if (MyPowerTelnet)
MyPowerTelnet->Send(&bByte, 1, FALSE, 0);
return ( TRUE ) ;
} // end of WriteCommByte()
//---------------------------------------------------------------------------
// BOOL WriteTTYBlock( HWND hWnd, LPSTR lpBlock, int nLength )
//
// Description:
// Writes block to TTY screen. Nothing fancy - just
// straight TTY.
//
// Parameters:
// HWND hWnd
// handle to TTY window
//
// LPSTR lpBlock
// far pointer to block of data
//
// int nLength
// length of block
//
//---------------------------------------------------------------------------
BOOL WriteTTYBlock( HWND hWnd, LPBYTE lpBlock, int nLength )
{
int i ;
RECT rect ;
if (NULL == TTYInfo)
return ( FALSE ) ;
for (i = 0 ; i < nLength; i++)
{
switch (lpBlock[ i ])
{
case 0:
// do not print NULLs
break;
case ASCII_BEL:
// Bell
MessageBeep( 0 ) ;
break ;
case ASCII_BS:
// Backspace
if (COLUMN( TTYInfo ) > 0)
COLUMN( TTYInfo ) -- ;
MoveTTYCursor( hWnd ) ;
break ;
case ASCII_CR:
// Carriage return
COLUMN( TTYInfo ) = 0 ;
MoveTTYCursor( hWnd ) ;
if (!NEWLINE( TTYInfo ))
break;
// fall through
case ASCII_LF:
// Line feed
if (ROW( TTYInfo )++ == MAXROWS - 1)
{
memmove( (SCREEN( TTYInfo )),
(SCREEN( TTYInfo ) + MAXCOLS),
(MAXROWS - 1) * MAXCOLS ) ;
memset( (SCREEN( TTYInfo ) + (MAXROWS - 1) * MAXCOLS),
' ', MAXCOLS ) ;
InvalidateRect( hWnd, NULL, FALSE ) ;
ROW( TTYInfo )-- ;
}
MoveTTYCursor( hWnd ) ;
break ;
default:
*(SCREEN( TTYInfo ) + ROW( TTYInfo ) * MAXCOLS +
COLUMN( TTYInfo )) = lpBlock[ i ] ;
rect.left = (COLUMN( TTYInfo ) * XCHAR( TTYInfo )) -
XOFFSET( TTYInfo ) ;
rect.right = rect.left + XCHAR( TTYInfo ) ;
rect.top = (ROW( TTYInfo ) * YCHAR( TTYInfo )) -
YOFFSET( TTYInfo ) ;
rect.bottom = rect.top + YCHAR( TTYInfo ) ;
InvalidateRect( hWnd, &rect, FALSE ) ;
// Line wrap
if (COLUMN( TTYInfo ) < MAXCOLS - 1)
COLUMN( TTYInfo )++ ;
else if (AUTOWRAP( TTYInfo ))
WriteTTYBlock( hWnd, (LPBYTE)"\r\n", 2 ) ;
break;
}
}
return ( TRUE ) ;
} // end of WriteTTYBlock()
//---------------------------------------------------------------------------
// VOID GoModalDialogBoxParam( HINSTANCE hInstance,
// LPCSTR lpszTemplate, HWND hWnd,
// DLGPROC lpDlgProc, LPARAM lParam )
//
// Description:
// It is a simple utility function that simply performs the
// MPI and invokes the dialog box with a DWORD paramter.
//
// Parameters:
// similar to that of DialogBoxParam() with the exception
// that the lpDlgProc is not a procedure instance
//
//---------------------------------------------------------------------------
BOOL GoModalDialogBoxParam( HINSTANCE hInstance, LPCSTR lpszTemplate,
HWND hWnd, DLGPROC lpDlgProc, LPARAM lParam )
{
BOOL DlgResp = DialogBoxParam( hInstance, lpszTemplate, hWnd, lpDlgProc, lParam ) ;
return (DlgResp);
} // end of GoModalDialogBoxParam()
//---------------------------------------------------------------------------
// BOOL FAR PASCAL __export AboutDlgProc( HWND hDlg, UINT uMsg,
// WPARAM wParam, LPARAM lParam )
//
// Description:
// Simulates the Windows System Dialog Box.
//
// Parameters:
// Same as standard dialog procedures.
//
//---------------------------------------------------------------------------
BOOL CALLBACK AboutDlgProc( HWND hDlg, UINT uMsg,
WPARAM wParam, LPARAM lParam )
{
switch (uMsg)
{
case WM_INITDIALOG:
{
char szBuffer[ MAXLEN_TEMPSTR ], szTemp[ MAXLEN_TEMPSTR ] ;
DWORD dwFreeMemory;
WORD wRevision, wVersion ;
// sets up the version number for Windows
wVersion = LOWORD( GetVersion() ) ;
switch (HIBYTE( wVersion ))
{
case 10:
wRevision = 1 ;
break ;
default:
wRevision = 0 ;
break;
}
wVersion &= 0xFF ;
GetDlgItemText( hDlg, IDD_TITLELINE, szTemp, sizeof( szTemp ) ) ;
wsprintf( szBuffer, szTemp, wVersion, wRevision ) ;
SetDlgItemText( hDlg, IDD_TITLELINE, szBuffer ) ;
// sets up version number for TTY
GetDlgItemText( hDlg, IDD_VERSION, szTemp, sizeof( szTemp ) ) ;
wsprintf( szBuffer, szTemp, VER_MAJOR, VER_MINOR, VER_BUILD ) ;
SetDlgItemText( hDlg, IDD_VERSION, (LPSTR) szBuffer ) ;
// get free memory information
dwFreeMemory = GetFreeSpace( 0 ) / 1024L ;
GetDlgItemText( hDlg, IDD_FREEMEM, szTemp, sizeof( szTemp ) ) ;
wsprintf( szBuffer, szTemp, dwFreeMemory ) ;
SetDlgItemText( hDlg, IDD_FREEMEM, (LPSTR) szBuffer ) ;
}
return ( TRUE ) ;
case WM_COMMAND:
if ((WORD) wParam == IDD_OK)
{
EndDialog( hDlg, TRUE ) ;
return ( TRUE ) ;
}
break;
}
return ( FALSE ) ;
} // end of AboutDlgProc()